﻿//
//  "$Id: Net.h 93401 2012-12-18 03:01:59Z li_weijun $"
//
//  Copyright (c)1992-2007, ZheJiang Dahua Technology Stock CO.LTD.
//  All Rights Reserved.
//
//	Description:	
//	Revisions:		Year-Month-Day  SVN-Author  Modification
//

#ifndef __NET_API_H__
#define __NET_API_H__

#ifdef __cplusplus
extern "C" {
#endif
#include <stdlib.h>
#include "Types.h"

/// \defgroup NetAPI API Net
/// 网络接口、DDNS与PPPoE的参数设置与获取。
/// @{

///////////////////////////////////////////////////////////////////////////////
////////////////////       网口操作API   /////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
//此组函数用于多网卡配置
int NetSetHostIPEx(const char *pEthName,  
		   			const char *pHostIp,
                 			const char *pNetmask);
/// 设置网关地址
int NetSetGatewayEx(const char *pEthName,
					     const char *pGateway);


/// 获取主机的IP地址
int NetGetHostIPEx(const char *pEthName,
		   			 char *pHostIp,
                 			 const int iHLen,
                 			 char *pNetmask,
                 			 const int iNLen);
/// 获取网关地址
int NetGetGatewayEx(const char *pEthName,
		    			     char *pGateway,
                  			     const int iGLen);
//获取EthName，供应用层调用。可从系统获取，现写死
//int NetGetEthName(int EthNo, char *pEthName, int len_EthName);

//*pEthName :	存入支持的网卡名,以::分隔,如eth0::eth2::
//len_EthName:	存入支持的网卡名BUF长度,一定要够长,否则失败
//*Ethnum:		实际找到的网卡数量

int NetGetEthName( char *pEthName, int len_EthName, int *iEthnum);

typedef struct NET_DEVICE_STATE
{
	uint64 transmittedBytes;	///< 发送数据字节总数
	uint64 receivedBytes;		///< 接受数据字节总数
	uint64 transmittedPackets;	///< 发送数据包总数
	uint64 receivedPackets;		///< 接受数据包总数
	char reserved[96];			///< 保留
}NET_DEVICE_STATE;

/// 获取网络设备状态
int NetGetDeviceState(char *name, NET_DEVICE_STATE* state);

/// 设置路由表的控制权
/// \param disable 控制标志	LIBDVR_ROUTE_ENABLE(0) 无特殊控制   
///							LIBDVR_ROUTE_DISABLE(1) 由应用控制
/// \retval 0 成功
/// \retval <0 失败
int NetDisableRoute(int disable);

int NetGetDefaultEth(char *pEthName);
int NetSetDefaultEth(const char *pEthName);

/// 获取默认网卡信息
/// \param pEthName 网卡名字接收缓存
/// \retval 0 成功
/// \retval <0 失败
int NetGetDefaultEth6(char *pEthName);
 
 
/// 设置默认网卡信息
/// \param pEthName 网卡名字
/// \retval 0 成功
/// \retval <0 失败
int NetSetDefaultEth6(const char *pEthName);


/// 在路由表中添加一条路由
/// \param pEthName 网卡名字
/// \param pAddress 目的网关(地址)
/// \param pNetmask 子网掩码
/// \retval 0 成功
/// \retval <0 失败
/// \note 添加默认路由时	pAddress 参数传"default"
///							pNetmask 参数传网关	
int NetAddRouteEth(const char *pEthName, const char *pAddress, const char *pNetMask);

/// 在路由表中删除一条路由
/// \param pEthName 网卡名字
/// \param pAddress 目的网关(地址)
/// \param pNetmask 子网掩码
/// \retval 0 成功
/// \retval <0 失败
/// \note 删除默认路由时	pAddress 参数传"default"
/// 						pNetmask 参数传网关
/// 	当pAddress和pNetmask的值为NULL，则删除指定网卡名对应的除默认路由外的路由项
int NetDelRouteEth(const char *pEthName, const char *pAddress, const char *pNetMask);

enum network_media {
 NM_WIRED = 0,  //有线网卡
 NM_WIRELESS,  //无线网卡
 NM_3G,		 // 3G网卡
 NM_NR,    //种类
};

typedef struct tagNetDevice
{
	char valid;			//当前网卡是否连接
	char trans_media;	//传输媒介
	char hasWps;	// 是否有wps功能，1表示有，0表示无
	char reserved[5];	//保留
	char name[32];		//网卡名称
	
}NetDevice;
/********************************************************************
**
**	函数名	:	NetGetEthDevice
**	入参	:	
**				1.	pNetDev:指向网卡属性结构NetDevice的指针数组。
**				2.	iMax   :最大支持的网卡个数(可以设置为10,目前实际为3个)
**	返回	:	> 0 支持的实际网卡个数
**				= 0 支持网卡个数为0,即失败
**	功能说明:	此函数用于应用层获取网卡支持的个数,以及对应网卡的种类和当前是否可用
**
*********************************************************************/
int NetGetEthDevice(NetDevice *pNetDev, int iMax);


/// 判断底层网络配置是否已经被重置，以便应用层决定是否使用用户指定的默认值。
/// 底层清空配置或者使用默认配置的时候，应返回1，如果配置已经被应用层修改，则返回0。
/// 
/// \retval 1 已经被重置
/// \retval 0  没有重置
/// \retval <0  获取状态失败
int NetConfigBeenReset(void);


/// 
/// \param [in] pEthName 接口名称，如eth0,eth1。
/// \param [out] pEthMac Mac16进制地址的字符串，形如00:05:0e:11:12:15。
/// \param [in] iEthMacLen MAC地址掩码长度。
/// \retval 0  获取成功
/// \retval <0  获取失败
int NetGetMAC(const char *pEthName,
                 char *pEthMac,
                 const int iEthMacLen);


/// 设置本机的Mac地址
/// 
/// \param [in] pEthName 接口名称，如eth0,eth1。
/// \param [in] pEthMac Mac16进制地址的字符串，形如00:05:0e:11:12:15
/// \retval 0  设置成功
/// \retval <0  设置失败
int NetSetMAC(const char *pEthName, const char *pEthMac);

/// 获取DNS地址
/// 
/// \param [in] pPrimary 首选的DNS服务器地址字符串。
/// \param [in] pSecondary 备选的DNS服务器地址字符串。
/// \param [in] iPlen 长度,要大于16
/// \retval 0  设置成功
/// \retval <0  设置失败
int NetGetDNSAddress(char *pprimary,const int iPlen ,char *psecondary, const int iSlen);
/// 设置DNS地址
/// 
/// \param [in] pPrimary 首选的DNS服务器地址字符串。
/// \param [in] pSecondary 备选的DNS服务器地址字符串。
/// \retval 0  设置成功
/// \retval <0  设置失败
int NetSetDNSAddress(const char * pPrimary, const char * pSecondary);

/// 设置DNS域名
/// 
/// \param [in] pDomain DNS域名字符串。
/// \retval 0  设置成功
/// \retval <0  设置失败
int NetSetDNSDomain(const char * pDomain);


/// 设置计算机名
/// 
/// \param [in] pHostName 计算机名字符串。
/// \retval 0  设置成功
/// \retval <0  设置失败
int NetSetDNSHostName(const char * pHostName);


/// 获取网口MTU
/// 
/// \param [in] pEthName 接口名称，如eth0,eth1。
/// \param [out] size MTU指针，字节为单位
/// \retval 0  获取成功
/// \retval <0  获取失败
int NetGetMTU(const char *pEthName, int *size);


/// 设置网口MTU
/// 
/// \param [in] pEthName 接口名称，如eth0,eth1。
/// \param [in] size MTU大小，字节为单位
/// \retval 0  设置成功
/// \retval <0  设置失败
int NetSetMTU(const char *pEthName, int size);


/// 根据接入设备的MAC 地址获取到对应物理端口号
///
/// \param [in] pEthName 接口名称，如eth0,eth1。
/// \param [in] pEthMac Mac16进制地址的字符串，形如00:05:0e:11:12:15。
/// \param [in] iEthMacLen MAC地址掩码长度。
/// \retval >=0 获取成功对应物理端口
/// \retval <0  获取失败
int NetGetSwitchPort(const char *pEthName, char *pEthMac, const int iEthMacLen);


/// 获取交换各个端口的连接状态
///
/// \param [in] pEthName 接口名称，如eth0,eth1。
/// \param [in] pLinkMask 物理连接状态掩码(如:1000 0101 表示端口1/3/8处于连接状态)
/// \retval =0 获取成功
/// \retval <0  获取失败
int NetGetSwitchLinkMask(const char *pEthName, int *pLinkMask);

///////////////////////////////////////////////////////////////////////////////
////////////////////////       DDNS API   /////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

/// DDNS配置结构
typedef struct NET_DDNS_CONFIG
{
	int		enable;			///< 是否启动DDNS，0-不启动，1-启动
	char	hostname[32];	///< 主机名，带0结束符的字符串。
	char	username[32];	///< DDNS服务用户名，带0结束符的字符串。
	char	password[32];	///< DDNS服务密码，带0结束符的字符串。
	char	serverip[32];	///< DDNS服务器IP地址，带0结束符的字符串，点分形式，如192.168.0.6。
	int		serverport;		///< DDNS服务端口。
} NET_DDNS_CONFIG;


/// 设置DDNS（动态域名解析）配置。
/// 
/// \param [in] pConfig 配置结构NET_DDNS_CONFIG指针。
/// \retval 0  设置成功
/// \retval <0  设置失败
int NetSetDDNSConfig(NET_DDNS_CONFIG *pConfig);


/// 获取DDNS（动态域名解析）配置， 如果没有配置，应当返回一个初始化的结构。
/// 
/// \param [out] pConfig 配置结构NET_DDNS_CONFIG指针。
/// \retval 0  获取成功
/// \retval <0  获取失败
int NetGetDDNSConfig(NET_DDNS_CONFIG *pConfig);


///////////////////////////////////////////////////////////////////////////////
////////////////////////       PPPoE API   ////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

/// PPPoE配置结构
typedef struct NET_PPPOE_CONFIG
{
	int		enable;			///< 是否启动PPPoE，0-不启动，1-启动
	char	username[32];	///< 帐户用户名，带0结束符的字符串。
	char	password[32];	///< 帐户密码，带0结束符的字符串。
} NET_PPPOE_CONFIG;


/// 设置PPPoE（以太网点对点）配置。
/// 
/// \param [in] pConfig 配置结构NET_PPPOE_CONFIG指针。
/// \retval 0  设置成功
/// \retval <0  设置失败
int NetSetPPPoEConfig(NET_PPPOE_CONFIG *pConfig);


/// 获取PPPoE（以太网点对点）配置，如果没有配置，应当返回一个初始化的结构。
/// 
/// \param [out] pConfig 配置结构NET_PPPOE_CONFIG指针。
/// \retval 0  获取成功
/// \retval <0  获取失败
int NetGetPPPoEConfig(NET_PPPOE_CONFIG *pConfig);


/// 获取PPPoE拨号后分配的IP地址
int NetGetDialIpAddress(char *pDailIp);


/// 获取网线连接状态
/// 
/// \param [out] ethname 网口名, 一般为"eth0"
/// \retval 0 连接正常
/// \retval other 异常
int mii_diag(char *ethname);


/// 检测IP地址是否冲突
/// 
/// \param [in] ethname 网口名, 一般为"eth0"
/// \retval 0 正常
/// \retval other 冲突
int ArpCheck(const char* ethname);


///////////////////////////////////////////////////////////////////////////////
/////////////////////////       WLAN API   ////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

#define IW_ENCODING_TOKEN_MAX 128 //64

#define ENCRYPTION_OFF	0
#define ENCRYPTION_ON	1
#define ENCRYPTION_OPEN 2		//WEP-OPEN
#define ENCRYPTION_SHARED 3		//WEP-SHARED
#define ENCRYPTION_TKIP 4		//WPA-PSK-TKIP
#define ENCRYPTION_AES 5		//WPA-PSK-AES/CCMP
#define ENCRYPTION_TKIP2 6 		//WPA2-PSK-TKIP
#define ENCRYPTION_AES2 7 		//WPA2-PSK-AES
#define ENCRYPTION_WPATKIP 8  //WPA-TKIP
#define ENCRYPTION_WPAAES 9  //WPA-CCMP
#define ENCRYPTION_WPA2TKIP 10  //WPA2-TKIP
#define ENCRYPTION_WPA2AES 11  //WPA2-AES

#define EAP_IDENTITY_LEN 32		//EAP身份长度
#define EAP_PASSWORD_LEN 32		//EAP密码长度
#define EAP_CERT_LEN 256		//EAP证书长度

typedef struct
{
	char isWirelessEnable;
	char reserved[3];
}ENABLE_T_WLAN;

typedef struct 
{
    int Enable;
	char SSID[36];
	int	LinkMode;	//0:auto 1:adhoc 2:Infrastructure
	int Encryption; //0: off  1:on 1:on 2:WEP-OPEN 3: WEP-SHARED, 4:WPA-PSK-TKIP, 5: WPA-PSK-CCMP, 6: WPA2-PSK-TKIP, 7: WPA2-PSK-AES
    int KeyType;  //0:Hex 1:ASCII
    int KeyID;
	char Keys[IW_ENCODING_TOKEN_MAX]; 
	int KeyFlag;
	int Reserved[3];
}CONFIG_WLAN;

typedef struct CONFIG_EAP
{
	unsigned int eapstyle;				//EAP方法 0:EAP_PEAP //1:EAP_TLS 2:EAP_TTLS
	unsigned int  authtype;				//EAP身份验证 0:EAP_NONE 1:EAP_PAP 2:EAP_MSCHAP 3:EAP_MSCHAPV2 4:EAP_GTC
	char identity[EAP_IDENTITY_LEN];	//身份
	char anonymous_identity[EAP_IDENTITY_LEN];	//匿名身份
	char password[EAP_PASSWORD_LEN];	//密码
	char ca_cert[EAP_CERT_LEN];			//ca证书
	char client_cert[EAP_CERT_LEN];		//用户证书
}CONFIG_EAP;

typedef struct 
{
	int Enable;
	char SSID[36];
	char BSSID[18]; //ap mac
	int LinkMode;	// 0:auto 1:adhoc 2:Infrastructure
	int Encryption;	// 0: off  1:on 2:WEP-OPEN 3: WEP-SHARED  
					// 4:WPA-PSK-TKIP, 5: WPA-PSK-CCMP(WPA-PSK-AES)
					// 6:WPA2-PSK-TKIP, 7:WPA2-PSK-AES
					// 8:WPA-TKIP       9:WPA-CCMP(WPA-AES)
					// 10:WPA2-TKIP     11:WPA2-AES
	int KeyType;	// 0:Hex 1:ASCII
	int KeyID;
	int scan_freq;
	char Keys[IW_ENCODING_TOKEN_MAX]; 
	int KeyFlag;
	CONFIG_EAP eap_config;
	int wmm_enable;                     // WMM是否使能 0：不使能WMM 1:使能WMM OPTIONAL_DEFAULT_CONFIG: 默认配置值
	unsigned char Reserved[18];
}CONFIG_WLAN_EXT;

///256个字节
typedef struct 
{
	char ssid[36];
	char keys[IW_ENCODING_TOKEN_MAX];
	char ipAddr[16];
	char subnetMask[16];
	char gateWay[16];
	int encryption;	// 0: off  1:on 2:WEP-OPEN 3: WEP-SHARED  
					// 4:WPA-PSK-TKIP, 5: WPA-PSK-CCMP(WPA-PSK-AES)
					// 6:WPA2-PSK-TKIP, 7:WPA2-PSK-AES
					// 8:WPA-TKIP       9:WPA-CCMP(WPA-AES)
					// 10:WPA2-TKIP     11:WPA2-AES
	int cfgMask;   /* 配置掩码，当前只判断ip信息是否有效，第一位为1时，IP信息有效 */
	int Reserved[9];
}CONFIG_SMARTLINK;

typedef struct 
{
	char	SSID[36];
	int	LinkMode;	//0:adhoc 1:Infrastructure
	int 	Encryption;	//0: off 1:on  2:WEP64bit 3: WEP128bit
}WLAN_DEVICE;

///\WLAN_DEVICE_EXT扩展结构128个字节
typedef struct
{
    char SSID[36];  //ap ssid
    char BSSID[18]; //ap mac
    unsigned char ApConnected; //0:not ; 1:connected
    unsigned char LinkMode; //0:auto 1:adhoc 2:Infrastructure
    int  RSSIQuality; ///< int:dB
    unsigned int ApMaxBitRate; ///<unit:bps;
    unsigned int Channel;///< 不大于14信道为2.4g,其他为5g; 
    unsigned int Freq; //对应的Channel的Freq
    unsigned char AuthMode; //0:OPEN;1:SHARED;2:WPA;3:WPA-PSK;4:WPA2;5:WPA2-PSK;
                            //6:WPA-NONE ;only use in Adhoc mode
                            //mix MODE
                            //7:WPA-PSK | WPA2-PSK; 
                            //8:WPA | WPA2;
                            //9:WPA | WPA-PSK;
                            //10:WPA2 | WPA2-PSK;
                            //11:WPA | WPA-PSK |WPA2 |WPA2-PSK
                            
                            
    unsigned char EncrAlgr; //0:NONE; 1:WEP; 2:TKIP; 3:AES(CCMP); 4 TKIP+AES( mix Mode)
    unsigned char LinkQuality; //0~100; unit:percent 
    unsigned char ApNetWorkType; //Reserved 0: 11b, 1: 11a, 2: 11a/n, 3: 11b/g, 4: 11b/g/n,5：11ac,6:11ax,unknown etc
    unsigned char WPSAbility;    // 1 : 支持WPS功能 0 : 不支持
    unsigned char Reserved[51];  //Reserved 
}WLAN_DEVICE_EXT ;

typedef struct
{
    char ssid[32];
    int AuthMode;     /*0:OPEN;1:SHARED;2:WPA;3:WPA-PSK;4:WPA2;5:WPA2-PSK;6:WPA|WPA2;7:WPA-PSK | WPA2-PSK*/
    int EncrypType;   /*0:NONE; 1:WEP; 2:TKIP; 3:AES(CCMP); 4 TKIP+AES( mix Mode)*/
    int WirelessMode; //Reserved 0: 11b, 1: 11a, 2: 11a/n, 3: 11b/g, 4: 11b/g/n,5：11ac,6:11ax,unknown etc
    int Channel;      /*1-11表示11个通道*/
    char key[IW_ENCODING_TOKEN_MAX];
    char IpAddr[16];
    char NetMask[16];
    char Ifname[8]; //网卡名
    int Reserved[6];
}WLAN_AP_CFG;

/* 无线网卡能力信息 */
typedef struct WLAN_CAPS
{
    int relayEnable;	/* 中继能力 0: 不支持 1：支持 */
    int zeroEnable;	    /* 零配置能力 0: 不支持 1：支持 */
    int reserved[30];
}WLAN_CAPS;

/*
**	************************************************************************
**					           函数申明
**	************************************************************************
*/
/*************************************************
 * Function:       WLanInit
 * Description:    初始化WIFI接口库
 * Calls:          None
 * Input:          None
 * Output:         None
 * Return:         =0:成功
 *                 =-1:失败
 * Author:        zhu_keyi
 * Created:        2011-11-3   15:00
*************************************************/
int WLanInit(void);

/*************************************************
 * Function:       WLanCheckModule
 * Description:    检测WIFI模块是否存在并准备好
 * Calls:          None
 * Input:          None
 * Output:         None
 * Return:         =0:没有检测到WIFI模块或WIFI模块不可用;
 *				   =1:检测到WIFI模块并已经准备好可以使用;
 * Author:         huang_zhendi
 * Created:        2010-03-01   10:00
*************************************************/
int WLanCheckModule(void);

/************************************************* 
 * Function:       WLanOpen
 * Description:    打开Wlan接口
 * Calls:          None
 * Input:          None
 * Output:         None
 * Return:         =0: 成功
 *			       -1: 失败
 * Author:         zhu_keyi
 * Created:        2011-11-3   15:00
*************************************************/ 
int WLanOpen(void);

/************************************************* 
 * Function:       WLanClose
 * Description:    闭关Wlan接口
 * Calls:          None
 * Input:          None
 * Output:         None
 * Return:         =0: 成功
 *			 	-1: 失败
 * Author:         zhu_keyi
 * Created:        2011-11-3   15:00
*************************************************/ 
int WLanClose(void);

/************************************************* 
 * Function:       WLanSmartLink
 * Description:    无线smartlink
 * Calls:          None
 * Input:          timeout:link超时时间，单位秒，推荐60秒
 * Output:         pconfig:AP站点的配置信息
 * Return:         =0:smartlink成功
 *                 -1:smartlink失败
 * Author:         wang_minchuan
 * Created:        2016-04-21   17:00
*************************************************/ 
int WLanSmartLink(CONFIG_SMARTLINK* pConfig, int timeout);


/************************************************* 
 * Function:       WLanSmartLinkOut
 * Description:    主动退出smartlink连接
 * Calls:          None
 * Input:          None
 * Output:         None
 * Return:         =0:操作成功
 *                 -1:操作失败
 * Author:         wang_minchuan
 * Created:        2016-09-28   17:00
*************************************************/ 
int WLanSmartLinkOut(void);


/************************************************* 
 * Function:       WLanSetConfig
 * Description:    连接指定的AP站点,目前未实现
 * Calls:          None
 * Input:          pconfig:指定AP站点的配置信息
 * Output:         None
 * Return:         =0:连接AP站点成功
 *				   -1:AP站点没有连接成功
 * Author:         zhu_keyi
 * Created:        2011-11-3   15:00
*************************************************/ 
int WLanSetConfig(CONFIG_WLAN* pconfig);


/************************************************* 
 * Function:       WLanSetConfig
 * Description:    连接指定的AP站点，带EAP方式
 * Calls:          None
 * Input:          pconfig:指定AP站点的配置信息
 * Output:         None
 * Return:         =0:连接AP站点成功
 *				   -1:AP站点没有连接成功
 * Author:         zhu_keyi
 * Created:        2011-12-12   10:00
*************************************************/ 
int WLanSetConfigExt(CONFIG_WLAN_EXT* pconfig);

/************************************************* 
 * Function:       WLanGetConfig
 * Description:    获取当前AP站点的配置信息,目前未实现
 * Calls:          None
 * Input:          pconfig:当前AP站点的配置信息
 * Output:         None
 * Return:         =0:获得信息成功
 *				   -1:没有获得配置信息
 * Author:         zhu_keyi
 * Created:        2011-11-3   15:00
*************************************************/ 
int WLanGetConfig(CONFIG_WLAN* pconfig);

/************************************************* 
 * Function:       WLanScanDevices
 * Description:    扫描WIFI站点,目前未实现
 * Calls:          None
 * Input:          num:需要扫描站点的数量,最大为32个
 * Output:        num:可用AP站点数量
 * Return:        !NULL:扫描到的AP站点信息
 *	                     NULL:没有扫描到AP站点		
 * Author:         zhu_keyi
 * Created:        2011-11-3   15:00
*************************************************/ 
WLAN_DEVICE* WLanScanDevices(char * num);

/************************************************* 
 * Function:       WLanScanAPs
 * Description:    扫描WIFI站点( 扩展，获得更多的信息)
 * Calls:          None
 * Input:          num:需要扫描站点的数量,最大为32个
 * Output:         num:可用AP站点数量
                   wlanlist: AP站点数组列表
 * Return:         >0:扫描到AP站点信息
 *	                 <0:没有扫描到AP站点		
 * Author:         zhu_keyi
 * Created:        2011-11-3   15:00
*************************************************/ 
int WLanScanAPs(WLAN_DEVICE_EXT wlanlist[], unsigned int *num);

/************************************************* 
 * Function:       WLanScanDevicesEx
 * Description:    扫描WIFI站点( 扩展，获得更多的信息)
 * Calls:          None
 * Input:          num:需要扫描站点的数量,最大为32个
 * Output:        num:可用AP站点数量
 * Return:        !NULL:扫描到的AP站点信息
 *	               NULL:没有扫描到AP站点		
 * Author:         zhu_keyi
 * Created:        2011-11-3   15:00
*************************************************/ 
WLAN_DEVICE_EXT *WLanScanDevicesEx(char *num);

/* $Function        :   WlanSetLog
==   =============================================================== 
==  Description     :   设置调试信息输出等级,注册到应用层DEBUG命令中
==  Argument        :   [IN] level: 字符形式的输入参数数组，取值范围0~4
==  Return          :   0: 成功 -1: 失败
==  Modification    :   2011/11/29    huang_zhendi    创建
==   =============================================================== 
*/
int WLanSetLog(int level);

/*************************************************
 * Function:       WLanConnChk
 * Description:    check the status of wireless connection
 * Calls:          None
 * Input:          None
 * Output:         None
 * Return:         =0: The connection is okey!
 *			 -1: The connection is fail!
 * Author:         zhu_keyi
 * Created:        2012-01-17   10:00
*************************************************/
int WLanConnChk(WLAN_DEVICE_EXT *pApInfo);

/*************************************************
 * Function:       WLanGetSsidInfo
 * Description:    获取ssid的相关信息
 * Calls:          None
 * Input:          ssid:添加的ssid
 * Output:         ap_info:输出的ssid的相关信息
 * Return:         =0: 成功
 *        -1: 失败
 * Author:         tan_shenqiu
 * Created:        2012-08-03   14:00
*************************************************/
int WLanGetSsidInfo(char *ssid, WLAN_DEVICE_EXT *ap_info);



/*************************************************
 * Function:       WLanCheckPbc
 * Description:    用于检测wps的按键状态，返回是否wps按键是否按下，返回值：
 * Calls:          None
 * Input:          
 * Output:         
 * Return:        0：没有按键 1：有按键
 * Author:         
 * Created:        2012-08-03   14:00
*************************************************/
int WLanCheckPbc(void);

/*************************************************
 * Function:       WlanReset
 * Description:    复位wifi模块
 * Calls:          None
 * Input:          None
 * Output:         None
 * Return:         =0: 成功
                   =-1: 失败
 * Author:         huang_zhendi
 * Created:        2011-09-16   10:00
*************************************************/
int WlanReset(void);

/*************************************************
 * Function:       WlanSetApCfg
 * Description:    配置AP模式参数
 * Calls:          None
 * Input:          pWlanApCfg:ap配置结构体指针
 * Output:         无
 * Return:         -1:操作失败;0:操作成功
 * Author:         wangmc
 * Created:        2015-01-29   
*************************************************/
int WlanSetApCfg(WLAN_AP_CFG *pWlanApCfg);

/*************************************************
 * Function:       WlanCheckAp
 * Description:    用于检测切换AP的按键状态，返回AP按键是否按下
 * Calls:          None
 * Input:          无
 * Output:         无
 * Return:         0：没有按键 1：有按键；<0:操作失败
 * Author:         wangmc
 * Created:        2015-01-29   
*************************************************/
int WlanCheckAp(void);

/*************************************************
 * Function:       WlanStaApSwitch
 * Description:    切换STA与AP模式
 * Calls:          None
 * Input:          flag:切换的模式,0:sta to ap; 1:ap to sta
 * Output:         无
 * Return:         -1:操作失败;0:操作成功
 * Author:         wangmc
 * Created:        2015-01-29   
*************************************************/
int WlanStaApSwitch(int flag);

/*************************************************
 * Function:       WlanGetZeroCfg
 * Description:    获取零配置热点信息
 * Calls:          None
 * Input:          无
 * Output:         pWlanCfg:热点信息
 * Return:         -1:操作失败;0:操作成功
 * Author:         wangmc
 * Created:        2019-01-24   
*************************************************/
int WlanGetZeroCfg(CONFIG_WLAN *pWlanCfg);

/*******************************************************************************
  Function:     WlanOpenDhcpc
  Description:  启动dhcpc服务
  Input:        -pInterfaceName:网卡名，目前不生效，写死wlan0
  Output:       无
  Return:       0: 操作成功
                -1: 操作失败
  Others:       无
*******************************************************************************/
int WlanOpenDhcpc(char *pInterfaceName);

/*******************************************************************************
  Function:     WlanCloseDhcpc
  Description:  关闭dhcpc服务
  Input:        -pInterfaceName:网卡名，目前不生效，写死wlan0
  Output:       无
  Return:       0: 操作成功
                -1: 操作失败
  Others:       无
*******************************************************************************/
void WlanCloseDhcpc(char *pInterfaceName);

/*******************************************************************************
  Function:     WlanStartDhcpd
  Description:  启动dhcpd服务
  Input:        -pInterfaceName:网卡名，目前不生效，写死wlan1
                -pPoolBase:网卡ip
                -pPoolStart:dhcp起始地址
                -pPoolEnd:dhcp结束地址
  Output:       无
  Return:       0: 操作成功
                -1: 操作失败
  Others:       无
*******************************************************************************/
int WlanStartDhcpd(const char *pInterfaceName,
                   const char *pPoolBase,
                   const char *pPoolStart,
                   const char *pPoolEnd);

/*******************************************************************************
Function:     WlanCloseDhcpc
Description:  设置nat转发
Input:        -pInterfaceName:网卡名
Output:       无
Return:       0: 操作成功
              -1: 操作失败
Others:       无
*******************************************************************************/
void WlanSetNatForward(char *pInterfaceName);

typedef enum 
{
	WPS_PUSH_BUTTON, 
	WPS_PIN_ENROLLEE, 
	WPS_PIN_REG
} WPS_CONN_TYPE;

typedef struct 
{
    char ssid[64];      //AP SSID,pin码方式连接要用到，pbc方式不需要
		char apPin[8];      //AP结点PIN码, WPS_PIN_REG方式时有效
    char wlanPin[8];    //WIFI设备pin码; 空字符串: 由驱动产生随机PIN码并返回; 非空字符串: 用户指定PIN码
                        //WPS_PIN_ENROLEE方式时有效     
    char bssid[6];     //暂时没实现。AP结点的MAC值, 全0表示任意AP结点，pbc方式时用到，
                       //若指定MAC值则连接指定的AP，若为0则连接按下wps按钮的AP
		char Reserve1[2];
		WPS_CONN_TYPE type;
    char reservel[36];
}CONFIG_WLAN_WPS;
 
/*************************************************
 * Function:       WLanWpsConnect
 * Description:    采用WPS方式连接。该接口只负责进行连接，至于连接成功与否不负责
 * Input:          WPS连接需要的参数
 * Output:         采用WPS_PIN_ENROLLEE方式连接，且cfg->wlanPin由驱动产生时，
                   cfg->wlanPin作为输出
 * Return:         =0: 连接配置成功。是否连接成功调用接口WLanConnChk检查
 *        -1: 连接配置失败
 * Author:         tan_shenqiu
 * Created:        2012-07-20   19:54
*************************************************/
int WLanWpsConnect(CONFIG_WLAN_WPS *cfg);
 

/*************************************************
 * Function:       WLanGetAPInfo
 * Description:    获取采用WPS连接成功的AP的信息，包括密码等
 * Input:          ap_info
 * Output:         已经连接成功的AP的信息
 * Return:         =0: 成功
 *        -1: 失败
 * Author:         tan_shenqiu
 * Created:        2012-09-06   8:19
*************************************************/
int WLanGetAPInfo(CONFIG_WLAN_EXT *ap_info);

/************************************************* 
 * Function:       WLanGetPin
 * Description:    获取用于PIN_ENROOL WPS连接方式的pin码
 * Calls:          None
 * Input:          pin:存放pin码的指针,
 *                 len:pin数组长度，最大32
 * Output:         pin:pin码
 * Return:         0:获取成功
 *                 < 0:获取失败 
 * Author:         
 * Created:        
*************************************************/ 
int WLanGetPin(char *pin, int len);

/************************************************* 
 * Function:       WlanSetRelay
 * Description:    设置中继模式
 * Calls:          None
 * Input:          enable:1:使能中继模式，0:禁止中继模式
 * Output:         无
 * Return:         0:获取成功
 *                 < 0:获取失败 
 * Author:         
 * Created:        
*************************************************/ 
int WlanSetRelay(int enable);

/************************************************* 
 * Function:       WLAN_GetCaps
 * Description:    获取无线网卡能力信息
 * Calls:          None
 * Input:          无
 * Output:         pCaps: 无线网卡能力信息
 * Return:         0: 获取成功
                   < 0:获取失败
 * Author:         
 * Created:        
*************************************************/ 
int WLAN_GetCaps(WLAN_CAPS *pCaps);

/*******************************************************************************
  Function:     WLAN_GetChnFromFreq
  Description: 
  Input:       	frequency
  Output:      	
  Return:       channel
                -1: failed
  Others:       ��
*******************************************************************************/
int WLAN_GetChnFromFreq(int freq);

/*******************************************************************************
  Function:     WLAN_GetFreFromChn
  Description: 
  Input:       	channel
  Output:      	
  Return:       frequency
                -1: failed
  Others:       
*******************************************************************************/
int WLAN_GetFreFromChn(int chn);

/*******************************************************************************
  Function:     WLAN_DisassociateSTA
  Description:  AP断开指定的STA的连接
  Input:       	pIfname: 网络接口名
				pAddress: STA mac地址
  Output:      	
  Return:       0
  Others:       
*******************************************************************************/
int WLAN_DisassociateSTA(const char *pIfname, const char *pAddress);

///////////////////////////////////////////////////////////////////////////////
////////////////////        3G网络API   ///////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////

/* 网络类型 */
typedef enum WirelessType
{
	WIRELESS_TYPE_AUTOSEL=0,		/* 自动选择*/
	WIRELESS_TYPE_TD_SCDMA=1,	/* TD-SCDMA网络 */
	WIRELESS_TYPE_WCDMA=2,		/* WCDMA网络 */
	WIRELESS_TYPE_CDMA_1x=3,		/* CDMA 1.x网络 */
	WIRELESS_TYPE_EDGE=4,		/* GPRS网络 */
	WIRELESS_TYPE_EVDO=5,		/*EVDO网络*/
	WIRELESS_TYPE_MAX
}WirelessType;

// 无线设备
typedef struct WIRELESS_DEVICE
{
	uint	typeMask; ///< 支持的网络类型掩码，按位表示，每一位对应WirelessType类型
	char	info[32]; ///< 其他信息
	char	name[32]; ///< 网络设备名
	int reserved[15];
}WIRELESS_DEVICE;

// 无线拨号配置
typedef struct WIRELESS_CONFIG
{
    int iEnable;					/* 无线模块使能标志 */
	WirelessType iNetType;			/* 无线网络类型*/
    char szAPN[32];		         	/* 接入点名称，字符串, 包括'\0'结束符共32bytes */
    char szDialNum[32];  			/* 拨号号码，字符串, 包括'\0'结束符共32bytes */
    char  szUserName[128];  		/* 拨号用户名，字符串, 包括'\0'结束符共128bytes */
    char szPWD[128];  				/* 拨号密码，字符串, 包括'\0'结束符共128bytes */
    int  szAuth;               //0: 不需要鉴权 1: PAP鉴权 2: CHAP鉴权
    char Reserved[4]; 				/* 预留8字节，供扩展 */
}WIRELESS_CONFIG;

// 无线网络状态
typedef struct WIRELESS_STATUS
{
    int iAccessStat;				/* 无线网络注册状态*/
    char szDevIP[16];  				/* 前端设备拨号IP，字符串, 包括'\0'结束符共16byte*/
    char szSubNetMask [16];  		/* 前端设备拨号子网掩码，字符串, 包括'\0'结束符共16byte */
    char szGateWay[16]; 			/* 前端设备拨号网关，字符串, 包括'\0'结束符共16byte */
	WirelessType iNetType : 8;		/* 无线网络类型*/
    int Reserved1 : 24;  			/* 保留字节，用于扩展*/
    char Reserved[4];  				/* 保留字节，用于扩展*/
}WIRELESS_STATUS;

// 无线网络信号强度,返回各个制式网络信号强度指示，范围0-100，100表示满格。
typedef struct  WIRELESS_RSSI
{
	int td_scdma;
	int wcdma;  
	int cdma_1x;  
	int edge; 
	int evdo;  
	int reserved[11]; /*保留字节，用于扩展*/
}WIRELESS_RSSI;


//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
// Function Name : int WirelessGetConfig (WIRELESS_CONFIG* pconfig)
// Description   : 该函数用来配置无线模块
// pconfig：WIRELESS_CONFIG结构类型变量指针
// return value：SUCCESS_RET：0 FAILURE_RET -1
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
//接口详细描述：
//pconfig作为输入形参时，WIRELESS_CONFIG结构体成员iEnable、iNetType、szAPN、szDialNum
//必须为有效值，同时API具体实现需要对上述作安全校验。
//IEnable = 1,表示允许进行拨号，0 ，表示非使能。
int WirelessGetConfig( WIRELESS_CONFIG* pconfig );


//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
// Function Name : int WirelessSetConfig (WIRELESS_CONFIG* pconfig)
// Description   : 该函数用来配置无线模块
// pconfig：WIRELESS_CONFIG结构类型变量指针
// return value：SUCCESS_RET：0 ，
//FAILURE_RET   ：-1，
//REBOOT_RET   :  -2
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
//接口详细描述：
//pconfig作为输入形参时，WIRELESS_CONFIG结构体成员iEnable、iNetType、szAPN、szDialNum
//必须为有效值，同时API具体实现需要对上述作安全校验。
//IEnable = 1,表示允许进行拨号，0 ，表示非使能。
//返回值 REBOOT_RET，表示当前配置要求重启。
int WirelessSetConfig( WIRELESS_CONFIG *pconfig );


//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
// Function Name : int WirelessGetStatus (WIRELESS_STATUS* pstatus)
// Description   : 该函数用来获取无线模块状态
// pstatus：WIRELESS_STATUS结构类型变量指针
// return value：SUCCESS_RET：0 FAILURE_RET -1
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
//接口详细描述：
//
//函数返回值与WIRELESS_STATUS结构体成员iAccessStat对应，与图形化界面 无线接入状态-注册状态 对应关系：
//   SUCCESS_RET：0 <---->注册网络成功
//   FAILURE_RET -1 <---->尚未注册到网络
int WirelessGetStatus( WIRELESS_STATUS* pstatus );


//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
// Function Name : GetNetWorkDevice( )
// Description   : 该函数返回无线模块类型
// device：WIRELESS_DEVICE结构类型变量指针
// return value：SUCCESS_RET：0 FAILURE_RET -1
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
int WirelessGetDevice( WIRELESS_DEVICE* device );


//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
// Function Name : int WirelessGetRSSI (WIRELESS_RSSI* prssi)
// Description   : 该函数用来获取无线模块信号强度状态
// prssi：WIRELESS_RSSI结构类型变量指针
// return value：SUCCESS_RET：0 FAILURE_RET -1
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
int WirelessGetRSSI (WIRELESS_RSSI* prssi);


//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
// Function Name : int WirelessGetSMS (char * pstring)
// Description   : 该函数用来获取短消息,非阻塞模式，应用程序可以每秒调用一次。
// sender：短信的发送者，字符串最大256字节(有可能是URL地址，所以需要比较大的空间)
// pstring：指向获取的短消息内容，UTF8格式，最大不超过256字节
// return value：SUCCESS_RET：0 FAILURE_RET -1
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
int WirelessGetSMS (char* sender, char * pstring);


//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
// Function Name : int WirelessPutSMS (char * pstring)
// Description   : 该函数用来发送短消息
// receivers：短信的接受者，为一个字符串指针数组，指针为空表示无效，字符串长度最大16字节。
// pstring：指向短消息的指针，UTF8格式，范围为256个字节
// return value：SUCCESS_RET：0 FAILURE_RET -1
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
int WirelessPutSMS (const char* receivers[32], const char * pstring);


//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
// Function Name : int WirelessGetDialog (char * pstring)
// Description   : 该函数用来获取语音呼叫,非阻塞模式，应用程序可以每秒调用一次。
// caller：语音呼叫者，字符串最大256字节(有可能是URL地址，所以需要比较大的空间)
// return value：SUCCESS_RET：0 FAILURE_RET -1
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
int WirelessGetDialog(char* caller);

//int WirelessAcceptDialog(char* caller);

//int WirelessMakeDialog(char* caller);

//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
// Function Name : WirelessNeedBlock(void)
// Description   : 该函数返回要求暂缓发送数据标志,在窄带处理机制中进行调用
// return value：0	表示直接发送
//				 1  表示停止向发送接口送数据 
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
int WirelessNeedBlock(void);

 
/* $Function        :   WirelessReset 
==   =============================================================== 
==  Description     :   复位3G模块
==  Argument        :   无
==  Return          :   0: 成功 <0: 失败
==  Modification    :   2011/10/8    huang_zhendi    创建
==   =============================================================== 
*/
int WirelessReset(void);
 
/* $Function        :   WirelessGetSim 
==   =============================================================== 
==  Description     :   获取SIM卡状态
==  Argument        :   无
==  Return          :   0: 不存 1:存在 <0: 失败
==  Modification    :   2011/10/8    huang_zhendi    创建
==   =============================================================== 
*/
int WirelessGetSim(void);

/* $Function        :   mobile_set_log
==   =============================================================== 
==  Description     :   设置调试信息输出等级,注册到应用层DEBUG命令中
==  Argument        :   [IN] level: 调试信息输出等级，取值范围0~4
==  Return          :   0: 成功 -1: 失败
==  Modification    :   2011/11/29    huang_zhendi    创建
==   =============================================================== 
*/
int WirelessSetLogLevel(int level);

/// 无线IMSI结构，供128字节
typedef struct WIRELESS_SIM_INFO
{
   char imsi[16];
   int reservered[28];
}WIRELESS_SIM_INFO;
 
/*  $Function        :   WirelessGetSimInfo
==  =============================================================== 
==  Description     :   获取SIM卡相关信息
==  Argument        :   无
==  Return          :   0: 成功  <0: 失败
==  Modification    :   2012/9/28    wang_jianyong    创建
==  =============================================================== 
*/
int WirelessGetSimInfo(WIRELESS_SIM_INFO *siminfo);
 

//////////////////////////////////////////////////////////
//														//
//					以下接口IPv6使用					//
//														//
//////////////////////////////////////////////////////////

/// 设置主机的IP地址
///
/// \param pHostIP[in] 主机IP地址点分字符串
/// \param pRefixlen[in] 子网前缀
/// \retval 0 成功
/// \retval <0 失败
int NetSetHostIP6(const char *pHostIP, const char *pRefixlen);

/// 设置主机的IP地址(针对多网卡)
/// \param pEthName[in] 网卡名
/// \param pHostIp[in] 主机IP地址点分字符串
/// \param pRefixlen[in] 子网前缀
///
/// \retval 0 成功
/// \retval <0 失败
int NetSetHostIPEx6(const char *pEthName, const char *pHostIp, const char *pRefixlen);

/// 获取主机IP地址和掩码
///
/// \param pHostIP[out] 主机IP地址缓冲
/// \param iHLen[in] 主机IP地址缓冲长度
/// \param pNetmask[out] 子网前缀字符串
/// \param iNLen[in] 子网前缀字符串缓冲长度
/// \retval 0 成功
/// \retval <0失败
int NetGetHostIP6(char *pHostIP,const int iHLen,char *pNetmask,const int iNLen);

/// 获取主机IP地址和掩码(针对多网卡)
///
/// \param pEthName[in] 网卡名
/// \param pHostIP[out] 主机IP地址缓冲
/// \param iHLen[in] 主机IP地址缓冲长度
/// \param pNetmask[out] 子网前缀字符串缓冲指针
/// \param iNetLen[in] 子网前缀字符串缓冲长度
/// \retval 0 成功
/// \retval <0 失败
int NetGetHostIPEx6(const char *pEthName,char *pHostIP,const int iHLen,char *pNetmask,const int iNLen);

/// 设置主机网关地址
///
/// \param pGateway[in] 主机网关地址点分字符串
/// \retval 0 成功
/// \retval <0 失败
int NetSetGateway6(const char *pGageway);

/// 设置主机网关(针对多网卡)
///
/// \param pEthName[in] 网卡名字
/// \param pGateway[in] 主机网关地址点分字符串
/// \retval 0 成功
/// \retval <0 失败
int NetSetGatewayEx6(const char *pEthName, const char *pGateway);

/// 获取主机网关地址
///
/// \param pGateway[out] 主机网关地址缓冲指针
/// \param iGLen[in] 主机网关地址缓冲长度
/// \retval 0 成功
/// \retval <0 失败
int NetGetGateway6(char *pGageway,const int iGLen);

/// 获取主机网关地址(针对多网卡)
///
/// \param pEthName[in] 网卡名字
/// \param pGateway[out] 主机网关地址缓冲指针
/// \param iGLen[in] 主机网关地址缓冲长度
/// \retval 0 成功
/// \retval <0 失败
int NetGetGatewayEx6(const char *pEthName, char *pGateway, const int iGLen);

/// 设置主机DNS地址
///
/// \param pPrimary[in] 首选DNS服务器地址点分字符串
/// \param pSecondary[in] 备选DNS服务器地址点分字符串
/// \retval 0 成功
/// \retval <0 失败
int NetSetDNSAddressip6(const char * pPrimary, const char * pSecondary);

/// 获取主机DNS地址
///
/// \param pprimary[out] 首选DNS服务器地址缓冲指针
/// \param iPlen[in] 首选DNS服务器地址缓冲长度
/// \param psecondary[out] 备选DNS服务器地址缓冲指针
/// \param iSlen[in] 备选DNS服务器地址缓冲长度
/// \retval 0 成功
/// \retval <0 失败
int NetGetDNSAddressip6(char *pprimary,const int iPlen ,char *psecondary, const int iSlen);

/// 获取网口的IPv6的链路地址
/// 
/// \param pEthName[in]  网卡名字
/// \param linklocal[out] 链路地址缓冲指针
/// \param length[in] 链路地址缓冲的长度，>=44Byte
/// \retval 0 成功
/// \retval <0 失败
 int GetLinkLocalAddress(const char *pEthName, char *linklocal, int length);


/// 获取指定的wifi信息
/// 
/// \param pWifiCfg[out]  wifi信息
/// \retval 0  操作成功
/// \retval <0 无指定wifi信息
int GetAppointedWifi(CONFIG_SMARTLINK *pWifiCfg);

/*************************************************
 * Function:       WlanStaApSwitch
 * Description:    获取网络带宽
 * Calls:          None
 * Input:          None
 * Output:         无
 * Return:         -1:操作失败; >=0 带宽，单位byte
 * Author:         xujie
 * Created:        2015-01-29   
*************************************************/

int WlanGetBandwidth(void);
/// hdcpc获取的ip信息，供128字节
typedef struct
{
   char ipaddr[16];
   char netmask[16];
   char gateway[16];
   int reservered[20];
} DhcpcIpInfo_t;

/// hdcps配置，供128字节
typedef struct
{
   char startAddr[16];
   char endAddr[16];
   int reservered[24];
} DhcpsCfg_t;

/// 启动dhcp客户端
/// 
/// \param pIfName 网卡名
/// \retval 0  操作成功
/// \retval <0 操作失败
int DhcpClientStart(const char *pIfName);

/// 关闭dhcp客户端
/// 
/// \param pIfName 网卡名
/// \retval 0  操作成功
/// \retval <0 操作失败
int DhcpClientStop(const char *pIfName);

/// 判断dhcp获取ip信息是否成功
/// 
/// \param pIfName 网卡名
/// \param pDhcpInfo ip信息
/// \retval 0  操作成功
/// \retval <0 操作失败
int DhcpClientIsBound(const char *pIfName, DhcpcIpInfo_t *pDhcpInfo);

/// 启动dhcp服务器
/// 
/// \param pIfName 网卡名
/// \param pDhcpsCfg dhcps相关配置，该参数暂时不可用
/// \retval 0  操作成功
/// \retval <0 操作失败
int DhcpServerStart(const char *pIfName, DhcpsCfg_t *pDhcpsCfg);

/// 关闭dhcp服务器
/// 
/// \param pIfName 网卡名
/// \retval 0  操作成功
/// \retval <0 操作失败
int DhcpServerStop(const char *pIfName);
 
/// @} end of group

#ifdef __cplusplus
}
#endif

#endif //__NET_API_H__
